
#include "IteradorArbolBMas.h"


IteradorArbolBMas::IteradorArbolBMas() {
	this->nodoActual = NULL;
	this->persistor = NULL;
	this->posicionActual = 0;
}

IteradorArbolBMas::IteradorArbolBMas(NodoHoja *hojaCorriente, int posicionActual, Persistor* persistor) {
	this->nodoActual = hojaCorriente;
	this->persistor = persistor;
	this->posicionActual = posicionActual;
}

IteradorArbolBMas::~IteradorArbolBMas() {
	if (nodoActual)
		delete nodoActual;
}

bool IteradorArbolBMas::hasNext() {
	if (nodoActual) {
		if(posicionActual < nodoActual->cantidadClaves)
			return true;
		else
			if (nodoActual->hojaSiguiente != 0)
				return true;
			else {
				posicionActual = 0;
				delete nodoActual;
				nodoActual = NULL;
				return false;
			}
	}
	return false;
}

RegistroArbol* IteradorArbolBMas::next() {
	if (!hasNext())
		return NULL;

	if (posicionActual == nodoActual->cantidadClaves){
		NodoHoja *nuevoNodoHoja = new NodoHoja();
		CadenaBytes cadena = persistor->leerBloque(nodoActual->hojaSiguiente);
		nuevoNodoHoja->Hidratar(cadena);
		nuevoNodoHoja->numero = nodoActual->hojaSiguiente;
		if (nodoActual)
			delete nodoActual;
		nodoActual = nuevoNodoHoja;
		posicionActual = 0;
	}
	RegistroArbol* registro = new RegistroArbol(nodoActual->claves[posicionActual].Clonar(), new CadenaBytes(nodoActual->datos[posicionActual]));
	posicionActual++;
	return registro;
}
